#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        //int cnt = 5;
        //while(cnt--)
        while(1)
        {
            printf("I am child process, pid: %d\n", getpid());
            sleep(1);
       
            //int a = 1;
            //a /= 0;
        }
        exit(0); // 终止子进程
        
    }
    else if(id > 0)
    {
        //while(1)
        //{
        //    printf("I am parent process, pid: %d\n", getpid());
        //    sleep(1);
        //}
        
        // 回收子进程，等待僵尸
        //sleep(10);
        //pid_t rid = wait(NULL);
        int status = 0;
        pid_t rid = waitpid(id, &status, 0);
        if(rid == id)
        {
            int exit_code = (status >> 8) & 0xFF; // 1111 1111
            int exit_sig = status & 0x7F; // 0111 1111
            printf("pid: %d, wait success!, status: %d, exit_code: %d, exit_sig: %d\n"
                    , getpid(), status, exit_code, exit_sig);
        }
        //sleep(5);
        exit(0);
    }
}

//int main()
//{
//    printf("hello world");
//    sleep(2);
//
//    //exit(11); // 刷新缓冲区
//    _exit(11); // 不刷新缓冲区
//}


//void Print()
//{
//    printf("hello world\n");
//    //return;
//    //exit(12);
//    _exit(21);
//}
//
//int main()
//{
//    Print();
//    exit(123);
//
//    while(1)
//    {
//        printf("I am a process\n");
//        sleep(1);
//    }
//
////    FILE* fp = fopen("./log.txt", "r"); // 失败
////    if(fp == NULL)
////    {
////        return errno;
////        //printf("%d->%s\n", errno, strerror(errno));
////    }
//
////    for(int i = 0; i < 200; ++i)
////        printf("%d->%s\n", i, strerror(i));
//    return 0;
//}
